package app.interceptor;

import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import common.standard.table.ModelAttributeEnum;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import app.entity.UserSession;
import app.utils.BasePathCollector;
import app.utils.Common;

/**
 * 判断用户权限的Spring MVC的拦截器
 */
public class AuthorizedInterceptor implements HandlerInterceptor {

	/** 定义不需要拦截的请求 */
	// private static final String[] IGNORE_URI = { "/index", "/login", "/register",
	// "/404.html" };
	private static final String LOGIN_PAGE = "login";

	/**
	 * preHandle方法是进行处理器拦截用的，该方法将在Controller处理之前进行调用，
	 * 当preHandle的返回值为false的时候整个请求就结束了。
	 * 如果preHandle的返回值为true，则会继续执行postHandle和afterCompletion。
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		/** 默认用户没有登录 */
		boolean flag = false;
		/** 获得请求的ServletPath */
		String servletPath = request.getServletPath();
		//获取returnurl
		String returnurl = Common.getUrlInFilter(request, response);
		returnurl = URLEncoder.encode(returnurl, "ISO-8859-1");
		
		//获取用户角色等级
		String subdir = request.getRequestURI();

		//切除角色后面部分多余链接
		subdir = subdir.substring(0, subdir.lastIndexOf("/"));
		//去角色
		subdir = subdir.substring(subdir.lastIndexOf("/") + 1, subdir.length());

		
		/** 判断请求是否需要拦截 */
		// for (String s : IGNORE_URI) {
		// if (servletPath.equals(s)) {
		// flag = true;
		// break;
		// }
		// }
		/** 拦截请求 */
		if (!flag) {
			/** 1.获取session中的用户 */
			UserSession user = (UserSession) request.getSession().getAttribute(Common.sessionUser);
			/** 2.判断用户是否已经登录 */
			if (user == null) {
				/** 如果用户没有登录，跳转到登录页面 */
				request.setAttribute(ModelAttributeEnum.MESSAGE.getAttributeName(), "请先登录再访问网站!");
				//request.getRequestDispatcher(LOGIN_PAGE+"?returnurl="+returnurl).forward(request, response);
				response.sendRedirect(BasePathCollector.getBasePathWithoutPort(request)+LOGIN_PAGE+"?returnurl="+returnurl);
				return flag;
			}else if (!Integer.valueOf(subdir).equals(user.getRoleId())) {
				/**3、判断角色是否与当前用户所属角色吻合**/
				response.sendRedirect(BasePathCollector.getBasePathWithoutPort(request)+ "/" + user.getRoleId()+"/index");
				return flag;
			} 
			else {
				/**4、用户已登录**/
				flag = true;
			}
		}
		return flag;

	}

	/**
	 * 该方法需要preHandle方法的返回值为true时才会执行。 该方法将在整个请求完成之后执行，主要作用是用于清理资源。
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception exception) throws Exception {

	}

	/**
	 * 这个方法在preHandle方法返回值为true的时候才会执行。 执行时间是在处理器进行处理之 后，也就是在Controller的方法调用之后执行。
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv)
			throws Exception {

	}
}
